package pe.gob.foncodes.ssa.web.controller;

import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import pe.gob.foncodes.ssa.bs.administracion.controller.GenericMaintenanceController;
import pe.gob.foncodes.ssa.bs.common.util.Constante;
import pe.gob.foncodes.ssa.bs.seguridad.domain.UnidadOrganizacional;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Usuario;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Zonal;
import pe.gob.foncodes.ssa.bs.seguridad.service.UsuarioService;

public class UsuarioController extends GenericMaintenanceController{
    
    protected static Logger log = Logger.getLogger(UsuarioController.class);
    
    private List<Usuario> lstUsuarios = new ArrayList<Usuario>();
    private Usuario selectedUsuario = new Usuario();
    private String codUsuario;
    private String codUnidad;
    private String codZonal;
    private String mensaje;
    private boolean esNuevo;
    private UsuarioService usuarioService;
    
    private List<Zonal> lstZonal;
    private Zonal zonalFiltro;
    
    private List<UnidadOrganizacional> lstUnidadOrganizacional;
    private UnidadOrganizacional unidadOrganizacionalFiltro;
    
    public UsuarioController(){
        inicio();
    }
    
    @PostConstruct
    public void init(ActionEvent event) throws Exception {
        inicio();
    }
    public void inicio() {
        log.info(">>> inicio >>>>>");
        selectedUsuario = null;
        esNuevo = false;
        lstUsuarios = new ArrayList<Usuario>();
        setBeanList(lstUsuarios);
   }
    
    @PostConstruct
    public void postConstruct() throws Exception{
        log.info("Post Construct");
        
        setLstZonal(new ArrayList<Zonal>());
        setLstZonal((List<Zonal>) getService().findByNamedQuery("Zonal.findAll"));
        log.info("Cargo Lista Zonal");
        setBeanList(getLstZonal());
        setLstUnidadOrganizacional(new ArrayList<UnidadOrganizacional>());
        setLstUnidadOrganizacional((List<UnidadOrganizacional>) getService().findByNamedQuery("UnidadOrganizacional.findByFlgActivo", new Object[]{Constante.ESTADO_ACTIVO}));
        setBeanList(getLstUnidadOrganizacional());
        log.info("Cargo Lista Unidad Organizacional");
        
    }
    
    @Override
    public void search(ActionEvent event) throws Exception{
        if(this.codUsuario == null)
            this.codUsuario = "";
        lstUsuarios = getService().findByNamedQuery("Usuario.findByFilter", new Object[]{codUsuario.toUpperCase() + "%"});
        setBeanList(lstUsuarios);
        selectedUsuario = null;
    }
    
    @Override
    public void clean(ActionEvent event) throws Exception{
        this.codUsuario = "";
        lstUsuarios = new ArrayList<Usuario>();
        setBeanList(lstUsuarios);
        selectedUsuario = null;
        
    }
    
    public String verDetallesUsuario(){
        if(this.selectedUsuario == null){
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Debe seleccionar un registro"));
            esNuevo = false;
            return null;
        }else{
            esNuevo = true;
            return "DetalleUsuario";
        }
    }
    
    public void saveUsuario(ActionEvent event) throws Exception {
        Usuario usuario =(Usuario)getBean();
        try {
            //Nuevo
            if(esNuevo){
                if (validate()) {
                    setBean(usuario);
                    super.doSave(event);
                }
            //Modificar
            }else{
                if (validate()) {
                    super.doUpdate(event);
                }
            }
        } catch (Exception e) {
            log.error(e);
        }
        
    }
    
    @Override
    public boolean validate() throws Exception{
        boolean success = true;
        
        return success;
    }

    public void validaReinicioPassword(){
        RequestContext context = RequestContext.getCurrentInstance();
        if(this.selectedUsuario == null){
            FacesContext faces = FacesContext.getCurrentInstance();
            faces.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Debe seleccionar un registro"));
        }else{
            context.execute("msjReiniciarContra.show()");
        }
    }
    
    public void modificaPassword(){
        
    }
    
    public String getCodUnidad() {
        return codUnidad;
    }

    public void setCodUnidad(String codUnidad) {
        this.codUnidad = codUnidad;
    }

    public String getCodUsuario() {
        return codUsuario;
    }

    public void setCodUsuario(String codUsuario) {
        this.codUsuario = codUsuario;
    }

    public String getCodZonal() {
        return codZonal;
    }

    public void setCodZonal(String codZonal) {
        this.codZonal = codZonal;
    }

    public boolean isEsNuevo() {
        return esNuevo;
    }

    public void setEsNuevo(boolean esNuevo) {
        this.esNuevo = esNuevo;
    }

    public List<Usuario> getLstUsuarios() {
        return lstUsuarios;
    }

    public void setLstUsuarios(List<Usuario> lstUsuarios) {
        this.lstUsuarios = lstUsuarios;
    }

    public String getMensaje() {
        return mensaje;
    }

    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

    public Usuario getSelectedUsuario() {
        return selectedUsuario;
    }

    public void setSelectedUsuario(Usuario selectedUsuario) {
        this.selectedUsuario = selectedUsuario;
    }

    public UsuarioService getUsuarioService() {
        return usuarioService;
    }

    public void setUsuarioService(UsuarioService usuarioService) {
        this.usuarioService = usuarioService;
    }

    /**
     * @return the lstZonal
     */
    public List<Zonal> getLstZonal() {
        return lstZonal;
    }

    /**
     * @param lstZonal the lstZonal to set
     */
    public void setLstZonal(List<Zonal> lstZonal) {
        this.setLstZonal(lstZonal);
    }

    /**
     * @return the zonalFiltro
     */
    public Zonal getZonalFiltro() {
        return zonalFiltro;
    }

    /**
     * @param zonalFiltro the zonalFiltro to set
     */
    public void setZonalFiltro(Zonal zonalFiltro) {
        this.zonalFiltro = zonalFiltro;
    }


    /**
     * @return the lstUnidadOrganizacional
     */
    public List<UnidadOrganizacional> getLstUnidadOrganizacional() {
        return lstUnidadOrganizacional;
    }

    /**
     * @param lstUnidadOrganizacional the lstUnidadOrganizacional to set
     */
    public void setLstUnidadOrganizacional(List<UnidadOrganizacional> lstUnidadOrganizacional) {
        this.lstUnidadOrganizacional = lstUnidadOrganizacional;
    }

    /**
     * @return the unidadOrganizacionalFiltro
     */
    public UnidadOrganizacional getUnidadOrganizacionalFiltro() {
        return unidadOrganizacionalFiltro;
    }

    /**
     * @param unidadOrganizacionalFiltro the unidadOrganizacionalFiltro to set
     */
    public void setUnidadOrganizacionalFiltro(UnidadOrganizacional unidadOrganizacionalFiltro) {
        this.unidadOrganizacionalFiltro = unidadOrganizacionalFiltro;
    }
    
}
